#ifndef GRASP_H
#define GRASP_H

#include "SolucaoGRASPCobertura.h"
#include "ListaSolucao.h"
#include <time.h>
#include <list>
#include <set>

#define NUM_ITER 200
#define FILTRO 1

using namespace std;

class GRASP{
	private:
		//int tamSolucao;
		double alpha;
		set<SolucaoGRASPCobertura *, SolucaoCompare> elite;
		SolucaoGRASPCobertura *buscaLocal(SolucaoGRASPCobertura *sol);
		void pathRelink(SolucaoGRASPCobertura *sol);
		SolucaoGRASPCobertura *svn(SolucaoGRASPCobertura *sol);
		SolucaoGRASPCobertura *perturbacao();
		void inicio(int GRASPmax);
	public:
		SolucaoGRASPCobertura *s;
		GRASP(double a, int nR){
			this->alpha = a;
			this->s = NULL;
                        this->numeroRepeticoes = nR;
		}
		
		void start(int GRASPmax);
		SolucaoGRASPCobertura *construcao(int clusterMin);
		void addFacilityIN(SolucaoGRASPCobertura *s, list<int> &lout, bool *out);
		struct timeval tempoAntes;
		struct timeval tempoDepois;
		struct timeval duracaoOtimizadorAntes;
		struct timeval duracaoOtimizadorDepois;
		int melhorIter;
                int melhorTodas;
                int piorTodas;
                int numeroRepeticoes;
                double mediaTodas;
                double mediaTempo;
};

#endif
